暂定翻译内容为 TypeScript Handbook,后续有空会补充翻译文档的其它部分; 项目地址:TypeScript-Doc-Zh,如果对你有帮助,可以点一个 star ~ 本章节官方文档地址:Narrowing 就像 TypeScript 如何使用静态类型分析运行时的值一样,它将类型分析覆盖在类似于 if/else 这样的 JavaScript 运行时控制流结构上,同时还包括了三元表达式、循环、真值检查等,这些都能对类型产生影响 这可能是讲解“真值”检查的一个不错的引子。 真值收缩 Truthiness 这个词可能在词典中找不到,但你一定在 JavaScript 中听过这个东西。 这至少可以防止出现像下面这样令人害怕的错误: TypeError: null is not iterable 但是请记住,对原始类型的真值检查常常容易出错。 同样的,我们也可以检查特定的字面量值(和变量相对)。在前面讲解真值收缩的例子中,我们编写的 printAll 函数存在潜在的错误,因为它没有适当地处理空字符串的情况。
and 运算符and 运算符用于检查两个(或多个)表达式是否都为 True。 体验AI代码助手 代码解读复制代码x = Truey = Falseresult = x and y # 输出 False值得注意的是,and 运算符是短路的,即如果第一个表达式为 False,则不会检查后面的表达式 python 体验AI代码助手 代码解读复制代码result = False and some_function() # some_function 不会被调用or 运算符or 运算符用于检查两个(或多个 python 体验AI代码助手 代码解读复制代码x = Truey = Falseresult = x or y # 输出 True同样,or 运算符也是短路的,即如果第一个表达式为 True,则不会检查后面的表达式 Python 会根据 Truthiness 值来评估它们。 not 运算符的优先级高于 and 和 or。 总结Python 中的 and, or, not 逻辑运算符在多种场景下都非常有用。
不晓得大家在利用 TypeScript 进行开发时,有没有觉得 TypeScript 在检查类型这块特别恼人,虽然知道这些类型检查的举动是非常好的,可以帮助我们减少许多可能会发生的潜在错误,今天就要来谈谈当我们在开发上遇到这种问题时该如何解决 这时候的读者一定知道要写一个 function 来处理这段错误信息: 的确错误信息没有了,但很奇怪的是 gender 竟然变成 never type 了,而这个就是 Type Guard 会做到的一个类型保护机制叫:Narrowing 类型收窄(Narrowing) Narrowing 翻成白话文就是类型收窄,在 TypeScript 的世界中每一个 enum 基本上都是独立存在彼此之间是没有交集的,关系图就像下面这样: image.png 总结 今天介绍了 TypeScript 中用来检查类型的方法,假如读者日后遇到类似这种问题不妨可以多加利用 Type Guard 进行检查,而不是直接开大绝用 @ts-ignore 或者 as 这两种方法 ,除了介绍类型检查外也介绍了如何进行类型转换,希望这些方法都可以让读者未来在使用上都不会有太多的问题。
if-elif-else 语句 (处理多个条件)score = 85if score >= 90: grade = 'A'elif score >= 80: # 注意:因为score<90才会到这里,所以这里只需检查 真值测试 (Truthiness)在 Python 中,很多值在条件语句中会被自动转换为布尔值:被认为是 False 的值 (falsy):FalseNone数值零:0, 0.0空序列:"", [], (), {}空集合:set()其他所有值都被认为是 True (truthy):True非零数值非空字符串、列表、元组、字典等示例:my_list = [1, 2, 3]if my_list: # 检查列表是否非空 name = ""if name: # 检查字符串是否非空 print(f"你好, {name}!")else: print("名字不能为空。")
instanceof 类型守卫 Instanceof是一个内置类型守卫,可用于检查一个值是否是给定构造函数或类的实例。 它用于其缩小范围,以及检查浏览器支持。 in的基本语法如下: propertyName in objectName 在下面的例子中,in 检查 house 属性是否存在。 function getValues(a: number | string, b: string) { if(a === b) { // this is where the narrowing . narrowed to string console.log(typeof a) // string } else { // if there is no narrowing 当您通过自己编写来创建自定义类型保护时,可以检查的内容没有限制。但是,如果自定义类型保护被错误地编写,它可能会带来很多错误。因此,精度是关键。
instanceof 类型保护 Instanceof是一个内置类型保护器,可用于检查一个值是否是给定构造函数或类的实例。 它用于其缩小范围,以及检查浏览器支持。 in类型保护的基本语法如下: propertyName in objectName 在下面的例子中,in类型守卫检查 house 属性是否存在。 function getValues(a: number | string, b: string) { if(a === b) { // this is where the narrowing . narrowed to string console.log(typeof a) // string } else { // if there is no narrowing 当您通过自己编写来创建自定义类型保护时,可以检查的内容没有限制。但是,如果自定义类型保护被错误地编写,它可能会带来很多错误。因此,精度是关键。
类型检查 Java的任意变量和引用经过类型声明(type declaration),才能使用。我们之前见过对象数据、类数据、方法参数、方法返回值以及方法内部的自动变量,它们都需要声明其类型。 Java是一种强类型(strongly typing)语言,它会对类型进行检查。如果我们错误的使用类型,将造成错误。 ? 这样的转换叫做收缩变换(narrowing conversion)。 Test { public static void main(String[] args) { int a; a = (int) 1.23; // narrowing
为此,我们必须考虑p,q和r的值的所有可能的组合,并检查对于所有这些组合,两个复合表达式确实具有相同的值。 将此计算组织成一个真值表是很方便的。 更一般地说,我们说如果它们总是具有相同的值,则两个复合命题在逻辑上是等价的,无论它们包含的命题变量是什么真值。 如果命题变量的数量很少,则很容易使用真值表,来检查两个命题是否在逻辑上等价。 检查p→q的定义,我们看到p→q是一个真实的陈述。大多数人会同意这一点。类似的例子值得一看。 很容易检查p→q在逻辑上等同于(¬p)∨q。 (只需检查(¬p)∨q的真值表)。同样,p↔q可以表示为((¬p) ∨q) ∧((¬q) ∨p),所以在严格的逻辑意义上,→,↔和⊕是不必要的。 这可以用真值表检查: p q p∨q ¬q (p∨q)∧¬q ((p∨q)∧¬q) → p false false false true false true false
有些朋友应该使用过一些 JavaScript 类型检查工具,比如 Flow 或者 是其他的静态类型检测语言类如 TypeScript。 具体的 TypeScript 基础的函数类型定义可以看看我的文章 TypeScript 基本类型和泛型的使用 缩小可能性范围 narrowing of possibility 一旦引入一个类型变量,就会出现一个奇怪的特性叫做 这种“可能性范围的缩小”(narrowing of possibility)允许我们利用类似 Hoogle 这样的类型签名搜索引擎去搜索我们想要的函数。类型签名所能包含的信息量真的非常大。 它们保证了我们可以检查不同的 a 是否相等,并在有不相等的情况下打印出其中的差异。 我们将会在后面的章节中看到更多类型约束的例子,其含义也会更加清晰。
什么是虚值和真值?分别有哪些? && 和 || 运算符能做什么? JavaScript属于什么类型的语言? 使用之前就需要确认其变量类型的称为 静态语言; 在运行过程中需要检查数据类型的语言称为 动态语言; 支持隐式类型转换的语言称为 弱类型语言,反之为 强类型语言。 什么是虚值和真值?分别有哪些? 简单的来说 虚值 就是 在转换为布尔值时 变为 false 的值,变为 true 的值则为 真值 。 如何检查值是否虚值?使用 Boolean 函数或者 !! 虚值(Falsy) 长度为 0 的字符串 数字 0 false undefined null NaN 真值(Truthy) 空数组 空对象 其他 && 和 || 运算符能做什么? 在其操作数中找到第一个虚值表达式并返回它,如果没有找到任何虚值表达式,则返回最后一个真值表达式。
特性说明静态类型(Static Typing)变量类型在编译时确定,编译器做类型检查。强类型(Strong Typing)类型不兼容会编译报错。 类型擦除(Type Erasure)泛型信息在运行时被擦除,仅用于编译期检查。 float f = l; // ✅ 自动double d = f; // ✅ 自动char c = 'A';int x = c; // ✅ char → int(ASCII值)强制转换(Narrowing 因为:反射是运行时操作编译器无法预知 invoke 会传什么类型所以 无法进行泛型类型检查stringList.add(42); // ❌ 编译错误! 强类型 + 静态检查 → 减少运行时错误类型擦除 → 兼容旧版本 JVM(无泛型时代)多态 + 动态绑定 → 支持面向对象灵活扩展null 设计 → 简单但危险
Caché 变量大全 $TEST 变量 包含使用TIMEOUT选项的最后一个命令产生的真值。 大纲 $TEST $T 描述 $test包含带有超时的最后一个命令产生的真值(1或0)。 当前块结构的IF命令既不设置也不检查它。当计算旧式IF命令的测试表达式时,$TEST被设置为等于结果真值。换句话说,如果if表达式测试为真,则$test被设置为1。 应用程序必须检查$test,然后生成适当的消息。
const obj = sum.objectTest(); expect(obj).toEqual({name: "jest",age: 20}) }); toEqual 会进行递归检查对象或者是数组 判断数据是否为空的情况 官方文档把这一类的校验命名为 Truthiness ,也就是有效性。
在每次迭代中,检查条件是否匹配。 将state设置为filter方法返回的新数组。 在每次迭代中,我们检查对象中的id属性是否不等于2,并返回结果。 ️ [{id: 1, name: 'Alice', country: 'Austria'}] console.log(filtered); filter方法返回一个新数组,该数组只包含回调函数返回真值的元素 == 2; }), ); }; 我们使用了逻辑与操作符,如果两边的条件都满足,将会返回真值。 逻辑或 下面是使用逻辑或操作符的例子。 return employee.name === 'Alice' || employee.name === 'Carl'; }), ); }; 2个条件中的任何一个都必须评估为真值
现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 类型守卫 概述 在 TypeScript 中,类型守卫可以用于在运行时检查变量的类型,并在代码块内部将变量的类型范围缩小到更具体的类型 这种类型收窄可以让 TypeScript 编译器更好地理解我们代码的意图,从而提供更准确的类型推断和类型检查。 instanceof 类型守卫 instanceof 类型守卫允许我们使用 instanceof 操作符来检查对象的类型,并在代码块内部收窄对象的类型范围。 真值类型守卫 真值收窄是一种在条件表达式中进行类型收窄的机制。当条件表达式的结果是真值时,TypeScript 编译 器会将变量的类型范围缩小为 true 的类型。 value.toUpperCase()); } else { console.log('Value is null or empty'); } } 在上面的示例中,当条件表达式 value 的结果是真值
真的情况下值为第一个真值,例如:0 or 1 or 2 为 1;0 or False or 2 为 2) and :与or相反,任意一个假即为假,同真为真(因为要挨个检查是否有假,所以真的情况下值为最后一个真值
TypeScript 是 JavaScript 的一个超集,添加了类型系统和编译期错误检查等功能 => 静态类型检查。 类型指的是一组具有相同特征的值。 未来兼容性 随着 ECMAScript 的更新而更新 需要更新 TypeScript 以支持新特性 TypeScript 本身不执行任何代码,只是添加了一个类型系统,用于在编译时提供类型安全和错误检查 https://typescript.p6p.net/typescript-tutorial/basic.html ↩︎ https://nodejs.cn/typescript/handbook/narrowing
在上面的示例中,只有一个分支(if A> B),分支覆盖率会检查是否真假两个分支都被触发了。 表达式覆盖率检查语句的右侧,统计所有可能组成的真值表的覆盖程度。 以下是包含3个布尔变量的表达式,它们决定了Result变量为true或false Result = (A && B) || (C) 针对A,B和C的所有可能情况,如下创建真值表。 条件覆盖率可以衡量此真值表的所有行是否都被覆盖。 Toggle coverage:翻转覆盖率可衡量仿真运行期间设计中信号和端口的翻转率。这有助于识别哪些信号一直没有翻转。 这对于基于测试平台结构(例如事务,序列,检查器,监视器等)实现功能覆盖率非常有用。 本期题目 [361] 什么是covergroups和bins?
for(constsofstrs){//❌可能出现TypeError:nullisnotiterableconsole.log(s);}}}解决方案:结合真值检查或显式null检查:展开代码语言:TypeScriptAI response.status==="success"){//处理成功响应processData(response.data);}else{//处理错误响应showError(response.message);}}第二章:真值检查 2.2真值检查的类型缩小效果展开代码语言:TypeScriptAI代码解释functionmultiplyAll(values:number[]|undefined,factor:number):number values){//values被缩小为undefinedreturnvalues;}else{//values被缩小为number[]returnvalues.map(x=>x*factor);}}2.3真值检查的潜在风险虽然真值检查很方便 =="object"){for(constsofstrs){console.log(s);}}else{console.log(strs);//包括空字符串}}}2.4实战场景:表单验证在表单验证中,真值检查用于处理可选字段
Pandas dataframe.ne()函数使用常量,序列或其他按元素排列的 DataFrame 检查 DataFrame 元素的不等式。 DataFrame或常量 axis:对于系列输入,轴与系列索引匹配 level:在一个级别上广播,在传递的MultiIndex级别上匹配索引值 返回:结果:DataFrame 范例1:采用ne()用于检查序列和 让我们使用dataframe.ne()评估不平等的功能 # evaluate inequality over the index axis df.ne(sr, axis = 0) 输出: 所有真值单元格都表示比较中的值彼此不相等 范例2:采用ne()用于检查两个datframe是否不相等的函数。一个 DataFrame 包含NA值。 d1f.ne(df2) 输出: 所有真值单元格都表示比较中的值彼此不相等,而所有假值单元格都表示比较中的值彼此相等。